using System.Collections;
using LS.UnityExtensions;

namespace LS.Digitize
{
    public static class SerializerExtensions
    {
	 //    public static void WriteProperties(this Serializer serializer, object obj, Writer writer)
		// {
		// 	if(serializer.Members == null)
		// 		serializer.GetMembers();
  //
		// 	for(int i=0; i< serializer.Members.Length; i++)
		// 	{
		// 		var property = serializer.Members[i];
		// 		writer.WriteProperty(property.name, property.reflectedMember.GetValue(obj), SerializerUtil.GetOrCreateSerializer(property.type));
		// 	}
		// }
  //
		// public static object ReadProperties(this Serializer serializer, Reader reader, object obj)
		// {
  //           // Iterate through each property in the file and try to load it using the appropriate
  //           // Member in the members array.
  //           foreach (string propertyName in reader.Properties)
		// 	{
		// 		// Find the property.
		// 		Member property = null;
		// 		for(int i=0; i<serializer.Members.Length; i++)
		// 		{
		// 			if(serializer.Members[i].name == propertyName)
		// 			{
		// 				property = serializer.Members[i];
		// 				break;
		// 			}
		// 		}
  //
  //               // If this is a class which derives directly from a Collection, we need to load it's dictionary first.
  //               if(propertyName == "_Values")
  //               {
  //                   var baseType = SerializerUtil.GetOrCreateSerializer(LSReflection.BaseType(obj.GetType()));
  //                   if(baseType.IsDictionary)
  //                   {
  //                       var dict = (IDictionary)obj;
  //                       var loaded = (IDictionary)baseType.Read(reader);
  //                       foreach (DictionaryEntry kvp in loaded)
  //                           dict[kvp.Key] = kvp.Value;
  //                   }
  //                   else if(baseType.IsCollection)
  //                   {
  //                       var loaded = (IEnumerable)baseType.Read(reader);
  //
  //                       var type = baseType.GetType();
  //
  //                       if (type == typeof(ListSerializer))
  //                       {
  //                           foreach (var item in loaded)
  //                               ((IList)obj).Add(item);
  //                       }
  //                       // else if (type == typeof(ES3QueueType))
  //                       // {
  //                       //     var method = baseType.DataType.GetMethod("Enqueue");
  //                       //     foreach (var item in loaded)
  //                       //         method.Invoke(obj, new object[] { item });
  //                       // }
  //                       // else if (type == typeof(ES3StackType))
  //                       // {
  //                       //     var method = baseType.type.GetMethod("Push");
  //                       //     foreach (var item in loaded)
  //                       //         method.Invoke(obj, new object[] { item });
  //                       // }
  //                       // else if (type == typeof(ES3HashSetType))
  //                       // {
  //                       //     var method = baseType.type.GetMethod("Add");
  //                       //     foreach (var item in loaded)
  //                       //         method.Invoke(obj, new object[] { item });
  //                       // }
  //                   }
  //               }
  //
  //               if (property == null)
  //               {
		// 			reader.Skip();
  //               }
		// 		else
		// 		{
		// 			var propertySerializer = SerializerUtil.GetOrCreateSerializer(property.type);
  //
		// 			if (LSReflection.IsAssignableFrom(typeof(DictionarySerializer), propertySerializer.GetType()))
		// 			{
		// 				property.reflectedMember.SetValue(obj, propertySerializer.Read(reader));
		// 			}
		// 			else if (LSReflection.IsAssignableFrom(typeof(CollectionSerializer), propertySerializer.GetType()))
		// 			{
		// 				property.reflectedMember.SetValue(obj, propertySerializer.Read(reader));
		// 			}
		// 			else
		// 			{
		// 				object readObj = reader.Read<object>(propertySerializer);
		// 				property.reflectedMember.SetValue(obj, readObj);
		// 			}
		// 		}
		// 	}
		// 	return obj;
		// }
		//
		// public static void GetMembers(this Serializer serializer)
		// {
		// 	serializer.GetMembers(null);
		// }
  //
		// public static void GetMembers(this Serializer serializer, string[] memberNames)
		// {
		// 	var serializedMembers = LSReflection.GetSerializableMembers(serializer.DataType, memberNames);
  //
		// 	serializer.Members = new Member[serializedMembers.Length];
		// 	for(int i=0; i<serializedMembers.Length; i++)
		// 		serializer.Members[i] = new Member(serializedMembers[i]);
		// }
		
		

    }
}